/**
 * 什么是迭代器(iterator)
 * 确使用户可在容器对象(container，例如链表或数组)上遍访的对象
 * 迭代器是帮助我们对某个数据结构进行遍历的对象
 * 在js中，迭代器是一个具体的对象，这个对象需要符合迭代器协议(iterator protocol)
 *  - 迭代器协议定义了产生一系列值（不论是有限个还是无限个）得标准方式
 *  - 那么在js中这个标准就是一个特定的next方法
 * next方法有如下要求
 *  - 一个无参数或一个参数的函数，返回一个应当拥有两个属性的对象：
 *  - done（boolean）
 *    - 如果迭代器可以产生序列中的下一个值则为false
 *    - 如果迭代器已经将序列迭代完毕，则为true
 *  -value 迭代器返回的任何JavaScript值，done为true时可以省略，但是一般情况下开发中都会写全
 */

const names = ['a', 'b', 'c', 'd']

let index = 0
const namesIterator = {
  next() {
    if (index < names.length) {
      return { done: false, value: names[index++] }
    } else {
      return { done: true, value: undefined }
    }
  },
}
console.log(namesIterator.next())
console.log(namesIterator.next())
console.log(namesIterator.next())
console.log(namesIterator.next())
console.log(namesIterator.next())
console.log(namesIterator.next())
